package token

import (
	"fmt"
	"time"

	"github.com/rs/xid"
)

func NewToken() *Token {
	return &Token{
		AccessToken:  xid.New().String(),
		RefreshToken: xid.New().String(),
		// 默认10分钟过期
		AccessTokenExpiredSecond: 10 * 60,
		// 默认40分钟
		RefreshTokenExpiredSecond: 10 * 60 * 4,
		IssueAt:                   time.Now().Unix(),
	}
}

// 判断ak是否过期
func (t *Token) IsAcccessTokenExpired() bool {
	d := time.Since(t.AcccessTokenExpiredTime())
	return d.Minutes() > 0
}

func (t *Token) AcccessTokenExpiredTime() time.Time {
	return t.IssueTime().Add(time.Duration(t.AccessTokenExpiredSecond * int64(time.Second)))
}

func (t *Token) IssueTime() time.Time {
	return time.Unix(t.IssueAt, 0)
}

// 用户对 服务(cmdb), 那个资源(secret)的 那个操作是否有权限(list)
func (t *Token) HasPerm(servce, secret, action string) error {
	if t.Roles == nil && len(t.Roles.Items) > 0 {
		return nil
	}

	// 每个角色挨着判断
	for i := range t.Roles.Items {
		r := t.Roles.Items[i]
		if r.HasPerm(servce, secret, action) {
			return nil
		}
	}

	return fmt.Errorf("无权限")
}

// 判断ak是否过期
func (t *Token) IsRefreshTokenExpired() bool {
	d := time.Since(t.RefreshTokenExpiredTime())
	return d.Minutes() > 0
}

func (t *Token) RefreshTokenExpiredTime() time.Time {
	return t.IssueTime().Add(time.Duration(t.RefreshTokenExpiredSecond * int64(time.Second)))
}
